// models/log_model.go
// 日志模型定义文件
// 该文件实现了带有自定义JSON序列化的枚举类型Level
// 以及使用该枚举类型的日志模型LogModel
package models

import "encoding/json" // JSON编解码包，用于实现自定义JSON序列化

// Level 自定义枚举类型，表示日志级别
// 基于int8类型，用于在数据库中存储为数值，但JSON序列化时会转换为更友好的格式
// 这种实现方式结合了数值存储的高效性和JSON表示的可读性

type Level int8

// 定义日志级别的常量值
// 每个常量代表一个具体的日志严重程度
const (
	InfoLevel    Level = 1 // 信息级别日志，表示一般信息性消息
	WarningLevel Level = 2 // 警告级别日志，表示需要注意但不影响系统运行的问题
	ErrorLevel   Level = 3 // 错误级别日志，表示系统发生了错误但仍能继续运行
)

// MarshalJSON 自定义Level类型的JSON序列化方法
// 实现了json.Marshaler接口，使Level类型在JSON序列化时转换为包含值和标签的对象
// 返回值:
//   []byte - 序列化后的JSON字节数组
//   error - 序列化过程中可能发生的错误
func (s Level) MarshalJSON() ([]byte, error) {
	var str string // 用于存储与枚举值对应的字符串标签
	// 根据枚举值确定对应的字符串标签
	switch s {
	case InfoLevel:
		str = "info"    // 信息级别的字符串表示
	case WarningLevel:
		str = "warning" // 警告级别的字符串表示
	case ErrorLevel:
		str = "error"   // 错误级别的字符串表示
	}
	// 注释掉的代码：只返回字符串标签
	// return json.Marshal(str)
	
	// 返回包含数值和标签的对象，便于前端展示和处理
	// 使用map[string]any类型构造复合JSON对象
	return json.Marshal(map[string]any{
		"value": int8(s), // 保留原始的数值表示
		"label": str,     // 提供人类可读的标签
	})

}

// LogModel 日志模型结构体
// 表示系统中的日志记录，包含日志ID、标题和级别信息
// 通过自定义的Level类型实现了日志级别的特殊JSON序列化

type LogModel struct {
	ID    uint   `json:"id"`              // 日志记录的唯一标识，GORM会自动映射为主键
	Title string `gorm:"size:32"`        // 日志标题，限制长度为32个字符
	Level Level  `json:"level"`          // 日志级别，使用自定义的Level枚举类型
}
